package com.lry.util;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 提供日期常用工具方法，如：日期格式化，字符串转化为时间等。
 *
 * @author 李瑞益
 */
public final class DateUtil {

    /**
     * 默认的日期格式。
     */
    private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 私有化构造函数，防止外部实例化。
     */
    private DateUtil() {
    }

    /**
     * 用yyyy-MM-dd HH:mm:ss将给定的日期为格式化为字符串。
     *
     * @param date 要格式化的日期。
     * @return yyyy-MM-dd HH:mm:ss格式的日期字符串。
     */
    public static String format(Date date) {
        return format(date, DEFAULT_FORMAT);
    }

    /**
     * 用指定的日期格式将给定的日期为格式化为字符串。
     *
     * @param date   要格式化的日期。
     * @param format 日期格式。
     * @return 格式化后的日期字符串，如果输入日期格式为null，则默认日期格式为yyyy-MM-dd HH:mm:ss。
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return null;
        }
        Assert.hasText(format, "格式化表达式为空");
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.format(date);
    }

    /**
     * 解析yyyy-MM-dd HH:mm:ss格式的字符串为日期对象。
     *
     * @param date 日期字符串。
     * @return 对应的日期对象，如果解析错误，则返回null。
     */
    public static Date parse(String date) throws ParseException {
        return parse(date, DEFAULT_FORMAT);
    }

    /**
     * 将给定格式的日期字符串解析为日期对象。
     *
     * @param date   日期字符串。
     * @param format 日期格式。
     * @return 对应的日期对象，如果解析错误，则返回null。
     */
    public static Date parse(String date, String format) throws ParseException {
        if (date == null) {
            return null;
        }

        SimpleDateFormat dateFormat = null;
        if (StringUtils.isEmpty(format)) {
            dateFormat = new SimpleDateFormat(DEFAULT_FORMAT);
        } else {
            dateFormat = new SimpleDateFormat(format);
        }

        Date result = null;

        result = dateFormat.parse(date);
        return result;
    }
}
